package com.juzi.inner;

public class Introduce {
    public static void main(String[] args) {
        System.out.println("============================\n" +
                "内部类\n" +
                "内部类就是定义在一个类里面的类，里面的类可以理解成（寄生），外部类可以理解成（宿主）。\n" +
                "public class People{\n" +
                "    // 内部类\n" +
                "    public class Heart{\n" +
                "    }\n" +
                "}\n" +
                "-------------------------------\n" +
                "内部类的使用场景\n" +
                " 场景：当一个事物的内部，还有一个部分需要一个完整的结构进行描述时。\n" +
                "-------------------------------\n" +
                "基本作用\n" +
                "内部类通常可以方便访问外部类的成员，包括私有的成员。\n" +
                "内部类提供了更好的封装性，内部类本身就可以用private ，protectecd等修饰，封装性可以做更多控制." +
                "-------------------------------\n" +
                "内部类的分类\n" +
                "   静态内部类[了解]\n" +
                "   成员内部类（非静态内部类） [了解]\n" +
                "   局部内部类[了解]\n" +
                "   匿名内部类（重点）\n" +
                "-------------------------------\n" +
                "什么是静态内部类？\n" +
                "有static修饰，属于外部类本身。\n" +
                "它的特点和使用与普通类是完全一样的，类有的成分它都有，只是位置在别人里面而已。\n" +
                "\n" +
                "public class Outer{\n" +
                "        // 静态成员内部类\n" +
                "        public static class Inner{\n" +
                "        }\n" +
                "}\n" +
                "\n" +
                "-------------------------------\n" +
                "静态内部类创建对象的格式：    \n" +
                "格式：外部类名.内部类名 对象名 = new 外部类名.内部类构造器;\n" +
                "范例：Outer.Inner in =  new Outer.Inner();\n" +
                "-------------------------------\n" +
                "静态内部类的访问拓展：\n" +
                "   1、静态内部类中是否可以直接访问外部类的静态成员？ \n" +
                "       可以，外部类的静态成员只有一份可以被共享访问。\n" +
                "   2、静态内部类中是否可以直接访问外部类的实例成员？ \n" +
                "       不可以的，外部类的实例成员必须用外部类对象访问。\n" +
                "\n" +
                "-------------------------------\n" +
                "静态内部类的使用场景、特点、访问总结。\n" +
                "  如果一个类中包含了一个完整的成分，如汽车类中的发动机类。 \n" +
                "  特点、使用与普通类是一样的，类有的成分它都有，只是位置在别人里面而已。\n" +
                "  访问总结：可以直接访问外部类的静态成员，不能直接访问外部类的实例成员。\n" +
                "  注意：开发中实际上用的还是比较少。\n" +
                "\n" +
                "-------------------------------\n" +
                "什么是成员内部类？\n" +
                "无static修饰，属于外部类的对象。\n" +
                "JDK16之前，成员内部类中不能定义静态成员，JDK 16开始也可以定义静态成员了。\n" +
                "\n" +
                "public class Outer {\n" +
                "    // 成员内部类\n" +
                "    public class Inner {\n" +
                "    \n" +
                "    }\n" +
                "}\n" +
                "\n" +
                "-------------------------------\n" +
                "成员内部类创建对象的格式：    \n" +
                "格式：外部类名.内部类名 对象名 = new  外部类构造器.new 内部类构造器();\n" +
                "范例：Outer.Inner in =  new Outer().new  Inner();\n" +
                "-------------------------------\n" +
                "1、成员内部类中是否可以直接访问外部类的静态成员？ \n" +
                "可以，外部类的静态成员只有一份可以被共享访问。\n" +
                "2、成员内部类的实例方法中是否可以直接访问外部类的实例成员？ \n" +
                "可以的，因为必须先有外部类对象，才能有成员内部类对象，所以可以直接访问外部类对象的实例成员。\n" +
                "\n" +
                "-------------------------------\n" +
                "成员内部类是什么样的、有什么特点？\n" +
                "   无static修饰，属于外部类的对象。\n" +
                "   可以直接访问外部类的静态成员，实例方法中可以直接访问外部类的实例成员。\n" +
                "成员内部类如何创建对象？\n" +
                "   外部类名.内部类名 对象名 = new  外部类构造器.new 内部类构造器();\u000B\n" +
                "\n" +
                "-------------------------------\n" +
                "局部内部类 （鸡肋语法，了解即可）\n" +
                "   局部内部类放在方法、代码块、构造器等执行体中。\n" +
                "   局部内部类的类文件名为： 外部类$N内部类.class。\n" +
                "-------------------------------\n" +
                "匿名内部类：\n" +
                "   本质上是一个没有名字的局部内部类。\n" +
                "   作用：方便创建子类对象，最终目的是为了简化代码编写。\n" +
                "-------------------------------\n" +
                "格式：\n" +
                "new 类|抽象类名|或者接口名() {\n" +
                "    重写方法;\n" +
                "};\n" +
                "\n" +
                "Employee a = new Employee() {\n" +
                "    public void work() {\n" +
                "    }\n" +
                "};\n" +
                "a. work();\n" +
                "\n" +
                "-------------------------------\n" +
                "特点总结：\n" +
                "   匿名内部类是一个没有名字的内部类，同时也代表一个对象。\n" +
                "   匿名内部类产生的对象类型，相当于是当前new的那个的类型的子类类型。\n" +
                "-------------------------------\n" +
                "匿名内部类的作用？\n" +
                "   方便创建子类对象，最终目的为了简化代码编写。\n" +
                "-------------------------------\n" +
                "匿名内部类的格式？\n" +
                "   Animal a = new Employee() {\n" +
                "       public void run() {\n" +
                "       }\n" +
                "   };\n" +
                "   a. run();\n" +
                "\n" +
                "-------------------------------\n" +
                "匿名内部类的特点？\n" +
                "   匿名内部类是一个没有名字的内部类，同时也代表一个对象。\n" +
                "   匿名内部类的对象类型，相当于是当前new的那个类型的子类类型。\n" +
                "-------------------------------\n" +
                "匿名内部类在开发中的使用形式了解\n" +
                "某个学校需要让老师，学生，运动员一起参加游泳比赛\n" +
                "\n" +
                "/*游泳接口*/\n" +
                "public interface Swimming {\n" +
                "    void swim();\n" +
                "}\n" +
                "\n" +
                "/* 测试类*/\n" +
                "public class JumppingDemo {\n" +
                "    public static void main(String[] args) {\n" +
                "        //需求：goSwimming方法\n" +
                "    }\n" +
                "     \n" +
                "    // 定义一个方法让所有角色进来一起比赛\n" +
                "    public static void goSwimming(Swimming swimming) {\n" +
                "        swimming.swim();\n" +
                "    }\n" +
                "\n" +
                "}\n" +
                "-------------------------------\n" +
                "使用总结\n" +
                "匿名内部类可以作为一个对象，直接传输给方法。\n" +
                "-------------------------------\n" +
                "匿名内部类在开发中的真实使用场景演示\n" +
                "给按钮绑定点击事件\n" +
                "\n" +
                "       //  为按钮绑定点击事件监听器。\n" +
                "    btn.addActionListener(new ActionListener() {\n" +
                "            @Override\n" +
                "            public void actionPerformed(ActionEvent e) {\n" +
                "                System.out.println(\"登录一下~~\");\n" +
                "            }\n" +
                "        });\n" +
                "      // 简化\n" +
                "      //  btn.addActionListener(e -> System.out.println(\"登录一下~~\"));\n" +
                "\n" +
                "使用总结\n" +
                "   匿名内部类通常是在开发中调用别人的方法时，别人需要我们写的时候才会定义出来使用。\n" +
                "   将来：匿名内部类还可以实现进一步的简化代码（后面其他技术会讲）\n" +
                "");
    }
}
